package ejb.cbm.seguridad.facade;

import java.lang.reflect.InvocationTargetException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import oracle.jdbc.OracleTypes;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cbm.commons.LdapHelper;
import ejb.cbm.admin.entity.ParametroEntity;
import ejb.cbm.admin.local.ParametroSessionLocal;
import ejb.cbm.commons.BaseFacade;
import ejb.cbm.commons.BaseRuntimeException;
import ejb.cbm.commons.JdbcHelper;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.PerfilBean;
import ejb.cbm.seguridad.bean.RegistroIngresoBean;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.cbm.seguridad.entity.RegistroIngresoEntity;
import ejb.cbm.seguridad.local.PerfilFacadeLocal;
import ejb.cbm.seguridad.local.PerfilSessionLocal;
import ejb.cbm.seguridad.local.RegistroIngresoFacadeLocal;
import ejb.cbm.seguridad.local.RegistroIngresoSessionLocal;
import ejb.cbm.seguridad.local.UsuarioSessionLocal;

////@Stateless(name="RegistroIngresoFacade",mappedName="RegistroIngresoFacade")
@Service("registroIngresoFacadeLocal")
public class RegistroIngresoFacade extends BaseFacade implements RegistroIngresoFacadeLocal{
	
	static Logger logger = Logger.getLogger(RegistroIngresoFacade.class.getName());
	
	//@EJB
	public RegistroIngresoSessionLocal registroIngresoSessionLocal;
	//@EJB
	public UsuarioSessionLocal usuarioSessionLocal;
	
	//@EJB
	public PerfilSessionLocal perfilSessionLocal;
	
	//@EJB
	public PerfilFacadeLocal perfilFacadeLocal;
	
	//@EJB
	public ParametroSessionLocal parametroSessionLocal;
	
	@Autowired
	public void setRegistroIngresoSessionLocal(
			RegistroIngresoSessionLocal registroIngresoSessionLocal) {
		this.registroIngresoSessionLocal = registroIngresoSessionLocal;
	}

	@Autowired
	public void setUsuarioSessionLocal(UsuarioSessionLocal usuarioSessionLocal) {
		this.usuarioSessionLocal = usuarioSessionLocal;
	}

	@Autowired
	public void setPerfilSessionLocal(PerfilSessionLocal perfilSessionLocal) {
		this.perfilSessionLocal = perfilSessionLocal;
	}

	@Autowired
	public void setPerfilFacadeLocal(PerfilFacadeLocal perfilFacadeLocal) {
		this.perfilFacadeLocal = perfilFacadeLocal;
	}

	@Autowired
	public void setParametroSessionLocal(ParametroSessionLocal parametroSessionLocal) {
		this.parametroSessionLocal = parametroSessionLocal;
	}
	

	////@Resource(mappedName="java:/jdbc/CONNEG")
	//this.protected DataSource dsContinuidad;
	
	////@Resource
	//private SessionContext sessionContext;

	public List<RegistroIngresoBean> buscar(RegistroIngresoBean filtro) {
		
		List<RegistroIngresoEntity> entities = registroIngresoSessionLocal.findByFiltro(filtro);
		List<RegistroIngresoBean> beans = new ArrayList<RegistroIngresoBean>();
		RegistroIngresoBean bean = null;

		try{
			for(RegistroIngresoEntity entity : entities){
				bean = new RegistroIngresoBean();
				BeanUtils.copyProperties(bean, entity);
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return beans;
	}
	
	public List<RegistroIngresoBean> busquedaRestringuida(RegistroIngresoBean filtro,
													      String	codigoUsuario, 
											              String	codigoOficina, 
											              String	tipoPerfil) throws SQLException {
		
		Connection con = null;
		List<RegistroIngresoBean> lstResultado = null;

		List<RegistroIngresoBean> beans = new ArrayList<RegistroIngresoBean>();
		ParametroEntity parametro = new ParametroEntity();
		RegistroIngresoBean bean = null;
		String descflagestado = "";

		try{
			con = this.getConnection();
			lstResultado = registroIngresoSessionLocal.findRegistrosByPerfil( con,
																		    filtro,
																			codigoUsuario, 
																			codigoOficina, 
																			tipoPerfil);
			
			for(RegistroIngresoBean beanRes : lstResultado){
				bean = new RegistroIngresoBean();
				BeanUtils.copyProperties(bean, beanRes);
				//UsuarioBean usuarioBean = LdapHelper.obtenerUsuarioLdap(bean.getCodigousuario());
				UsuarioBean usuarioBean = new UsuarioBean();
				usuarioBean.setCodigousuario(beanRes.getCodigousuario());
				usuarioBean.setCodigooficina(beanRes.getCodigooficina());
				//usuarioBean.setCodigoPuesto(beanRes.getUsuarioBean().getCodigoPuesto());
				usuarioBean.setCodigoPuesto(beanRes.getCodigoPuesto());
				usuarioBean.setNombre(beanRes.getNombre());
				usuarioBean.setApellidopaterno(beanRes.getApellidopaterno());
				usuarioBean.setApellidomaterno(beanRes.getApellidomaterno());
				PerfilBean perfilBean = perfilFacadeLocal.obtienePerfilByCodigoUsuario(usuarioBean); 
				usuarioBean.setPerfilBean(perfilBean);
				if(perfilBean==null){continue;}
				if(perfilBean.getTipoperfil()==1){
					if(filtro.getUsuarioBean().getCodigoPuesto() == null || filtro.getUsuarioBean().getCodigoPuesto().trim()==""){
						parametro = parametroSessionLocal.findParametro(new Long(4), new Double(beanRes.getFlagestado()));
						descflagestado = parametro.getDescripcion();
						bean.setDescflagestado(descflagestado);
						bean.setUsuarioBean(usuarioBean);
						beans.add(bean);
					}
					else if(filtro.getUsuarioBean().getCodigoPuesto() != null && filtro.getUsuarioBean().getCodigoPuesto().equals(perfilBean.getCodigoperfil().toString())){
						parametro = parametroSessionLocal.findParametro(new Long(4), new Double(beanRes.getFlagestado()));
						descflagestado = parametro.getDescripcion();
						bean.setDescflagestado(descflagestado);
						bean.setUsuarioBean(usuarioBean);
						beans.add(bean);
					}
				}
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch (Exception e) {
			e.printStackTrace();logger.error(e);
			con.close();
		}finally{
			JdbcHelper.close(con,null,null,null,null);
		}
		
		return beans;
	}
	
	public RegistroIngresoBean ultimoRegistroIngreso(String codigoUsuario, String fecha) {
		
		List<RegistroIngresoEntity> entities = registroIngresoSessionLocal.findLast(codigoUsuario, fecha);
		RegistroIngresoBean bean = null;

		try{
			for(RegistroIngresoEntity entity : entities){
				bean = new RegistroIngresoBean();
				BeanUtils.copyProperties(bean, entity);
			}
		
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return bean;
	}

	////@TransactionAttribute(TransactionAttributeType.REQUIRED)
	@Transactional(propagation=Propagation.REQUIRED)
	public void save(RegistroIngresoBean registroIngresoBean,
					 UsuarioBean usuarioLogeado){
		
		RegistroIngresoEntity entity = null;
		
		try{
			if(registroIngresoBean.getNumeroregistro()==null){
	
				entity = new RegistroIngresoEntity(
						registroIngresoBean.getNumeroregistro(),
						registroIngresoBean.getCodigousuario(),
						registroIngresoBean.getCodigoterminal(),
						registroIngresoBean.getCodigooficina(),
						registroIngresoBean.getFlagestado(),
						registroIngresoBean.getFlagactivo(),
						usuarioLogeado.getCodigousuario(),
						new Date(),
						usuarioLogeado.getCodigousuario(),
						new Date(),
						usuarioLogeado.getNombre(),
						usuarioLogeado.getApellidopaterno(),
						usuarioLogeado.getApellidomaterno(),
						usuarioLogeado.getCodigoPuesto(),
						usuarioLogeado.getCodigooficina()
						 );
				registroIngresoSessionLocal.save(entity);
			}else{
				entity = registroIngresoSessionLocal.findById(registroIngresoBean.getNumeroregistro());
				if(registroIngresoBean.getCodigousuario()!=null)entity.setCodigousuario(registroIngresoBean.getCodigousuario());
				if(registroIngresoBean.getCodigoterminal()!=null)entity.setCodigoterminal(registroIngresoBean.getCodigoterminal());
				if(registroIngresoBean.getCodigooficina()!=null)entity.setCodigooficina(registroIngresoBean.getCodigooficina());
				if(registroIngresoBean.getFlagestado()!=null)entity.setFlagestado(registroIngresoBean.getFlagestado());
				if(registroIngresoBean.getFlagactivo()!=null)entity.setFlagactivo(registroIngresoBean.getFlagactivo());
				entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
				entity.setFechamodificacion(new Date());
				registroIngresoSessionLocal.update(entity);
			}
		}catch(RuntimeException e){
			//JdbcHelper.rollback(sessionContext);
			e.printStackTrace();
		}finally{
			//JdbcHelper.commit(sessionContext);
		}
	}
	
	public RegistroIngresoBean obtenerRegistroIngresoById(Long numeroRegistro) {
		
		RegistroIngresoEntity entity = registroIngresoSessionLocal.findById(numeroRegistro);
		RegistroIngresoBean bean = null;

		try{

			bean = new RegistroIngresoBean();
			BeanUtils.copyProperties(bean, entity);

		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return bean;
	}
	
	public String verificarOficina(String oficina)throws Exception{
		
		CallableStatement cs = null;
		Connection con = null;
		String error="SIN ERROR";
		String resultado=null;
		try{
			con = getConnection(); 
			cs = con.prepareCall("call CONNEG.PQ_CONTINUIDAD.sp_verificar_oficina(?,?,?)");
			cs.setString(1,oficina);
			cs.registerOutParameter(2,OracleTypes.VARCHAR);
			cs.registerOutParameter(3,OracleTypes.VARCHAR);
			cs.executeQuery();
			error = cs.getString(3);
			
			if(error == null || !error.equals("SIN ERROR")){
				throw new Exception(error);
			}
			
			resultado = cs.getString(2);
			
		}catch (Exception e) {
			throw e;
		}
		finally{
			JdbcHelper.close(con,cs,null,null,null);
		}
		return resultado;
	}
}
